home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGBLER / ASMCODE3.LZH / NOLF.ASM < prev    next >
Assembly Source File  |  1984-04-05  |  5KB  |  89 lines

  1. PAGE 66,132
  2. TITLE NOLF - PRINTER FRONT END
  3. ;
  4. ; BY: RICHARD HAMILTON (713) 726-9459
  5. ;
  6. ; PURPOSE:
  7. ; THIS PROGRAM IS A FRONT END TO THE PRINTER INTERRUPT TO DELETE ANY 
  8. ; LINE FEEDS SENT BY THE SOFTWARE TO THE PRINTER. THIS IS FOR PRINTERS
  9. ; WHICH WILL ALWAYS INSERT LF AFTER CR.
  10. ;
  11. ; NOTE: THROUGH OUT THIS PROGRAM THE PRINTER INTERRUPT IS REFERRED TO
  12. ;       BY IT'S DECIMAL NUMBER. MANY PEOPLE REFUR TO INTERRUPTS BY
  13. ;       THEIR HEXIDECIMAL NUMBER. THE PRINTER INTERRUPT IS 17H OR 23D.
  14. ;
  15. ; TECHNICAL DESIGN:
  16. ; THIS PROGRAM SHOULD BE INVOKED IN THE AUTOEXEC.BAT FILE OR ANY TIME 
  17. ; AFTER BOOTING DOS. UPON FIRST ENTRY THE PROGRAM WILL SAVE THE STANDARD 
  18. ; INTERRUPT 23 ADDRESS IN THIS PROGRAM FOR A JUMP AFTER CHECKING THE 
  19. ; CHARTER SENT (IN AL) FOR LF. THE STANDARD INTERRUPT 23 ADDRESS WILL
  20. ; BE REPLACED WITH THE ADDRESS OF THIS PROGRAM'S SECONDARY ENTRY POINT
  21. ; CHARACTER SCANNING. NEXT THE PROGRAM WILL EXIT TO DOS WITH AN INTERRUPT
  22. ; 27H TO STAY RESIDENT. BECAUSE THE PSP PRECEEDS THIS CODE, 100H BYTES ARE
  23. ; TAKEN FROM AVALIABLE MEMORY FOR THE PSP BY USING INT 27H. MANY PROGRAMS
  24. ; MOVE THE CODE FROM THE SECONDARY ENTRY POINT TO PROGRAM'S LASTBYTE AND
  25. ; OVERLAY THE PSP. THEN THEY DO NOT ADJUST DX FOR THE PSP LENGTH, AND
  26. ; CONSEQUENTLY KEEP RESIDENT ONLY THE LENGTH OF CODE THAT WAS MOVED OVER
  27. ; THE PSP. BECAUSE WE ARE USING INT 27, ONLY THE FIRST 5C OF THE PSP IS 
  28. ; NECESSARY TO KEEP. ALTHOUGH THIS PRACTICE SAVES A FEW BYTES, IT WAS
  29. ; NOT DONE IN THIS PROGRAM FOR THE SAKE OF SIMPLICITY. AS THIS PROGRAM IS
  30. ; RIGHT NOW, IT TAKES LESS THAN 300 BYTES INCLUDING THE PSP.
  31. ; PLEASE CONSULT THE TECHNICAL REFERENCE MANUAL STARTING OF PAGE A-42 FOR 
  32. ; ADDITIONAL INSIGHTS INTO THE BIOS PRINTER INTERRUPT HANDLER.
  33. ;
  34. ; INPUTS:  AL CONTAINS INPUT PRINT BYTE
  35. ;          ALL OTHER VALUES UNKNOWN
  36. ;
  37. ; OUTPUTS: AL CONTAINS INPUT PRINT BYTE OR
  38. ;          AN IRET IS DONE WITH NO PROCESSING
  39. ;
  40. CSEG     SEGMENT PARA PUBLIC 'CODE'
  41.          ASSUME  CS:CSEG
  42. START    PROC    FAR
  43. INIT:                                 ;THIS POINT IS ENTERED ONLY ONCE TO SET
  44.                                       ;UP VECTOR TABLE FOR INT23.
  45.                                       ;INTERRUPT VECTOR ADDRESSES FOR INVOCKING
  46.                                       ;AT THE SECONDARY ENTRY POINT "PRINT".
  47.          CLI                          ;CLEAR INTERRUPTS SO WE WILL NOT BE 
  48.                                       ;INTERRUPTED BY ANY ADDITIONAL PRINTING.
  49.          XOR    DX,DX                 ;SET DX TO 0 FOR MOVE INTO ES.
  50.          MOV    ES,DX                 ;POINT TO LOWEST SEGMENT IN DOS.
  51.          LDS    DX,DWORD PTR ES:INT23_ADDR ;GET PREVIOUS INT 23 SEGMENT & OFFSET.
  52.          MOV    WORD PTR CS:INT23_SAV,DX ;STORE REAL INT23 ADDRESS IN OUR ROUTINE.
  53.          MOV    WORD PTR CS:INT23_SAV+2,DS ;ALSO STORE INT23 SEGMENT ADDRESS.
  54.          MOV    WORD PTR ES:INT23_OFF,OFFSET PRINT ;STORE OUR NEW ENTRY POINT
  55.                                       ;OFFSET IN VECTOR TABLE.
  56.          MOV    ES:INT23_SEG,CS       ;STORE OUR NEW SEGMENT ADDRESS IN VECTOR
  57.                                       ;TABLE.
  58.          STI                          ;IT IS NOW SAFE TO ALLOW INTERRUPTS.
  59.          LEA    DX,WORD PTR CS:LASTBYTE ;SET PROGRAM LENGTH FOR INT 27H SO DOS
  60.                                       ;KNOWS HOW MUCH MEMORY WILL BE RESIDENT
  61.          ADD    DX,100H               ;ADD IN LENGTH OF PSP IN TOTAL MEMORY.
  62.          INT    27H                   ;GO BACK TO DOS WITH RESIDENCY.
  63. ;
  64. ; THE FOLLOWING IS LOCATED HERE BECAUSE THE MICROSOFT ASSEMBLER HAS A BUG
  65. ; WHICH WILL RESOLVE THE FOWARD DOUBLE WORD REFERENCE TO THIS VARIABLE, BUT
  66. ; WILL STILL INDICATE A PHASE ERROR. THIS BUG HAS BEEN REPORTED TO IBM AND
  67. ; MICROSOFT.
  68. INT23_SAV DD     0                    ;INTERRUPT 23 JUMP TABLE ADDRESS SAVE AREA.
  69. ;
  70. PRINT:
  71.          CMP    AL,CS:LINEF           ;IS THE CHAR A LINE FEED?
  72.          JE     SKIPLF                ;YES, GO SKIP LINEFEED.
  73.          JMP    DWORD PTR INT23_SAV   ;JUMP TO BIOS FOR STANDARD KB PROCESSING.
  74. SKIPLF:  IRET                         ;RETURN TO PROGRAM DOING NOTHING.
  75. ;
  76. ; DATA DEFINITIONS FOLLOW. THESE ARE IN THE CODE SEGMENT FOR SIMPLICITY.
  77. ;
  78. LINEF     DB     0AH                   ;DEFINE CHAR FOR LINEFEED.
  79. INT23_ADDR EQU   5CH                   ;OFFSET INTO VECTOR TABLE FOR INT23 ADDRESS. 
  80. INT23_OFF EQU    5CH                   ;OFFSET INTO VECTOR TABLE FOR INT23 OFFSET.
  81. INT23_SEG EQU    5EH                   ;OFFSET INTO VECTOR TABLE FOR INT23 SEGMENT.
  82. LASTBYTE  EQU    $+1                   ;THIS MUST BE ONE MORE THAN THE LAST BYTE OF
  83.                                        ;THIS PROGRAM TO INDICATE TO DOS HOW MUCH
  84.                                        ;MEMORY TO KEEP RESIDENT AFTER INT 27H.
  85. START     ENDP
  86. CSEG      ENDS
  87.           END
  88.